-
Notifications
You must be signed in to change notification settings - Fork 13.6k
Allow linking a prebuilt optimized compiler-rt builtins library #143689
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Allow linking a prebuilt optimized compiler-rt builtins library #143689
Conversation
This PR modifies If appropriate, please update This PR modifies If appropriate, please update
cc @tgross35 |
This comment has been minimized.
This comment has been minimized.
27fcb13
to
1ea1789
Compare
I don't really know much about the optimized compiler-rt builtins. Maybe @tgross35 might know more? |
Can you say more about how much time this saves? Historically it's been my impression locally that building is basically free, this flag is more about whether it's possible to build (e.g., needs to be off if you're ad-hoc cross compiling). Though maybe I'm remembering wrong? |
The goal is to enable optimized compiler-builtins in fedora packaging. There, rust is built using the distro provided llvm and resulting libraries. Some runtime features are absent if optimized compiler-builtins are not used. Notably, outlined aarch64 LSE atomic operations are not available without this support. |
Right, it's less about time and more about wanting to use our existing system LLVM packages. |
Ping @tgross35. The intent here is to enable optimized-builtins in Fedora using the system's compiler-rt.builtins library. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The changes to compiler-builtins lgtm with a possible rename of the var, assuming you have verified this works locally. Somebody more familiar with bootstrap (@Kobzol?) will need to review the changes there.
// Optionally, link against a prebuilt compiler-rt library to supply | ||
// optimized intrinsics instead of compiling a subset of compiler-rt | ||
// from source. | ||
let link_against_prebuilt_rt = env::var_os("LLVM_BUILTIN_RT_LIB").is_some(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe LLVM_COMPILER_RT_LIB
to match RUST_COMPILER_RT_ROOT
, and since this is probably linking the entire compiler-rt rather than just builtins. Also I believe the LLVM library is called "builtins" rather than "builtin"
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In the case of fedora, compiler-rt builtins is packaged as a distinct library. I plan on linking against it. Looking at build.rs
, on some targets (e.x openbsd), is only a broader compiler-rt library available to link against?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Huh, I have no idea. The context is here rust-lang/compiler-builtins#241
My view of compiler-rt was that it's a large library where components may be turned on and off, which I guess may not be accurate. Maybe it's worth a doc comment in this file that we say we link the whole thing but it can be only the builtins portion.
Extend the <target>.optimized-compiler-builtins bootstrap option to accept a path to a prebuilt compiler-rt builtins library, and update compiler-builtins to enable optimized builtins without building compiler-rt builtins.
1ea1789
to
8ce8e15
Compare
I did test builds with the fedora targets (excepting s390x, it lacks a libcompiler-rt.builtins library in rawhide right now). Likewise, I verified the LSE support linked in for aarch64 does work. Is it a realistic case to consider something trying to link libgcc.a or libcompiler-rt.builtins.a when std already includes a copy of libcompiler-rt.builtins? That case I haven't tested. |
if let Some(dir) = rt_builtins_ext.parent() { | ||
println!("cargo::rustc-link-search=native={}", dir.display()); | ||
} | ||
println!( | ||
"cargo::rustc-link-lib=static:+verbatim={}", | ||
rt_builtins_ext.to_str().unwrap() | ||
); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Does println!("cargo::rustc-link-arg={}", rt_builtins_ext.to_str().unwrap())
work to replace these by chance? I think passing the exact path to the linker should avoid needing to set both -l
and -L
.
I think this can happen in niche build setups, but no special handling should be needed; all three libraries make their builtin symbols weak, so conflicts aren't a problem. |
☔ The latest upstream changes (presumably #144773) made this pull request unmergeable. Please resolve the merge conflicts. |
Extend the .optimized-compiler-builtins bootstrap option to accept a path to a prebuilt compiler-rt builtins library, and update compiler-builtins to enable optimized builtins without building compiler-rt builtins.